op.16 控制混亂的時空
沒想到穿越的時空間裡充滿了混亂
沒辦法穩定的建立連結
看來只好對這時空間進行控制了
天啊!今天好多人都在烤肉,受不了欸......而且還可以烤到塑膠味猛衝,跟鬼一樣欸(怕
昨天的 Broker 雖然實作完成了,但是欠缺基本的防護,等於是說任何人只要知道你的 IP 都可以對其灌入資料,像昨天只是暫時性的寫完正在紀錄文章時,就有其他不是自己的使用端加入進來,今天就是要來對其進行基本防護與網路相關的設定。
先附上昨天的程式碼
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Adapter;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Receiving;
using MQTTnet.Diagnostics;
using MQTTnet.Protocol;
using MQTTnet.Server;
namespace mqtt_3._0._5
{
class Program
{
private static MqttServer MqttServer = null;
static void Main(string[] args)
{
MqttAsync();
while (true) ;
}
private static async Task MqttAsync()
{
var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100).WithDefaultEndpointPort(1883);
var mqttServer = new MqttFactory().CreateMqttServer();
await mqttServer.StartAsync(optionsBuilder.Build());
mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
{
Console.WriteLine($"Client:{e.ClientId} Topic:{e.ApplicationMessage.Topic} Message:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload ?? new byte[0])}");
});
mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
{
Console.WriteLine($"Client:{e.ClientId} 已連接!");
});
mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
{
Console.WriteLine($"Client:{e.ClientId}已離線!");
});
}
}
}
那麼,在進行教學前,可以先至這位作者的 Github 觀看,內容極其豐富與精采,許多功能也都有提供例子可以參考看看。
那麼接下來就進入正題,關於基本防護的部分。
var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100).WithDefaultEndpointPort(1883).WithConnectionValidator(e =>
{
if(e.Password != "PassWord")
{
e.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
return;
}
});
在剛開始的 optionsBuilder 之中,我們修改了其內容,在後段加入了 WithConnectionValidator ,並且對應到 e 參數。在其中寫入了簡單的判斷,當如果密碼不對時,那便回傳 ReasonCode ,回應表示密碼或使用者名稱錯誤,這樣可以做到基本的防護,也算是可以做個簡單的加密。
這裡附上尚未輸入密碼時的 Broker 運行截圖,因為密碼錯誤,所以導致無法成功地建立連線。
手機端的 APP 顯示則是
在輸入密碼後,便可以正常連接
到這邊就算是完成基本防護啦。
另外除了密碼防護外,也可以進行使用者名稱的限定,比如黑名單的概念。
這裡就放上簡單的 UserName 的程式碼供大家參考。
if (e.Username == "blacklist")
{
e.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
return;
}
詳細更多深入功能可以進到 這裡 閱讀,作者真的很用心!
接下來就要進到設定網路的部分啦~相信一定有人因為有 AP 的關係,所以無法正確的連接,那這樣要怎麼辦呢?
很簡單,其實只要設定一下 AP 即可,這裡使用 小米 的作為使用範例。
1.進到設定頁面,各家畫面會有不同
2.找尋 "端口轉發"、"Port forwarding" 、 "連接埠轉送" 等字詞,總之各家的名子也會有所不同。
3.將 MQTT 的 Port (初始為:1883) 轉送到對應的區域網路的 IP。
這樣就完成設定啦!
那麼今天是中秋節,也祝各位中秋節快樂啦XD,記得還是要少吃一點以免中秋假期後體重上升喔 :)